/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persona;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import Congresos.Congreso;
import Congresos.Trabajo;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Hashtable;
import java.util.Vector;

/**;
 *
 * @author alejandro.suarez3
 */
public class Presidente implements Serializable {

    private String nombre;
    private String dni;
    private String pasword;
    private String afiliacion;
    private String direccion;
    private String correoElectronico;
    private Congreso congreso;

    public Presidente(String nombre, String dni, String pasword, String afiliacion, String direccion, String correoElectronico) {
        setNombre(nombre);
        setDni(dni);
        setPasword(pasword);
        setAfiliacion(afiliacion);
        setDireccion(direccion);
        setCorreoElectronico(correoElectronico);
        congreso = null;

    }

    public Presidente(String nombre, String dni, String pasword, Congreso congreso, String afiliacion, String direccion, String correoElectronico) {
        setNombre(nombre);
        setDni(dni);
        setPasword(pasword);
        setAfiliacion(afiliacion);
        setDireccion(direccion);
        setCorreoElectronico(correoElectronico);
        setCongreso(congreso);

    }

    public String getAfiliacion() {
        return afiliacion;
    }

    public void setAfiliacion(String afiliacion) {
        this.afiliacion = afiliacion;
    }

    public String getCorreoElectronico() {
        return correoElectronico;
    }

    public void setCorreoElectronico(String correoElectronico) {
        if (correoElectronico.contains("@")) {
            this.correoElectronico = correoElectronico;
        } else {
            this.correoElectronico = "";
            System.out.println("El correo electronico es incorrecto");
        }
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public Congreso getCongreso() {
        return congreso;
    }

    public void setCongreso(Congreso congreso) {
        this.congreso = congreso;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getPasword() {
        return pasword;
    }

    public void setPasword(String pasword) {
        this.pasword = pasword;
    }

    public void obtenerTrabajos(Autor autor) {
        ArrayList<Trabajo> trabajos = congreso.getTrabajosCon();
        int chequeo = 0;
        for (int i = 0; i < trabajos.size(); i++) {
            for (int j = 0; j < trabajos.get(i).getUsuarios().size(); j++) {
                if (trabajos.get(i).getUsuarios().get(j).getDni().equals(autor.getDni()) || trabajos.get(i).getPonente().getDni().equals(autor.getDni())) {
                    System.out.println("Trabajo con id " + i);
                    chequeo = 1;
                    congreso.imprimirTrabajos(trabajos.get(i));
                    break;
                }

            }
        }
        if (chequeo == 0) {
            System.out.println("No existe ningun trabajo con este autor");
        }

    }

    public void obtenerTrabajos(String tematica) {
        ArrayList<Trabajo> trabajos = congreso.getTrabajosCon();
        int chequeo = 0;
        for (int i = 0; i < trabajos.size(); i++) {
            if (trabajos.get(i).getTematica().equals(tematica)) {
                System.out.println("Trabajo con id " + i);
                chequeo = 1;
                congreso.imprimirTrabajos(trabajos.get(i));
            } else {
                for (int j = 0; j < trabajos.get(i).getSubTematicas().size(); j++) {
                    if (trabajos.get(i).getSubTematicas().get(j).equals(tematica)) {
                        System.out.println("Trabajo con id " + i);
                        chequeo = 1;
                        congreso.imprimirTrabajos(trabajos.get(i));
                        break;
                    }
                }
            }


        }
        if (chequeo == 0) {
            System.out.println("No existe ningun trabajo con dicha tematica");
        }
    }

    public void obtenerTrabajosResumen(ArrayList<String> cadena) { // Mirar Todo
        ArrayList<Trabajo> trabajos = congreso.getTrabajosCon();
        ArrayList<Integer> indices = new ArrayList<Integer>();
        ArrayList<Integer> valores = new ArrayList<Integer>();

        String resumen;
        int contador;

        for (int i = 0; i < trabajos.size(); i++) {
        contador = 0;
        for (int j=0;j<cadena.size();j++){
            resumen = trabajos.get(i).getResumen();
            

            while (resumen.indexOf(cadena.get(j)) > -1) {
                resumen = resumen.substring(resumen.indexOf(cadena.get(j)) + cadena.get(j).length(), resumen.length());
                contador++;

            }
            
        }
        if (contador > 0) {
                indices.add(i);
                valores.add(contador);

            }
        }
//ordenacion dos vectores;
        if (valores.isEmpty() != true) {
            Integer aux;
            Integer aux2;

            for (int i = 0; i < valores.size() - 1; i++) {
                for (int j = i; j < valores.size(); j++) {

                    if (valores.get(i) < valores.get(j)) {
                        aux = valores.get(j);
                        aux2 = indices.get(j);
                        valores.remove(j);
                        indices.remove(j);
                        valores.add(j, valores.get(i));
                        indices.add(j, indices.get(i));
                        valores.remove(i);
                        indices.remove(i);
                        valores.add(i, aux);
                        indices.add(i, aux2);
                    }
                }

            }
            for (int i = 0; i < indices.size(); i++) {
                System.out.println("El titulo del libro es " + trabajos.get(indices.get(i)).getTitulo() + " y el numero de coincidencias es: " + valores.get(i));
            }
        }
        else{
            System.out.println("No ahi ningun trabajo que contenga la palabra");
        }
    
    }

    public void asignarTrabajosRevisores() {

        for (int i = 0; i < congreso.getTrabajosCon().size(); i++) {   //Cojemos todos los trabajos
            if (congreso.getTrabajosCon().get(i).getFechas().size() < 3) {

                int contador = 0;
                while (congreso.getTrabajosCon().get(i).getFechas().size() < 3 && contador != congreso.getTrabajosCon().size() + 1) {  //Mientras que no tengamos 3 revisores asignados a un trabajo

                    contador = congreso.getTrabajosCon().size() + 1;  //MIramos cuantos trabajos ahi en total
                    for (int j = 0; j < congreso.getRevisores().size(); j++) {  // recorremos todos los revisores del congreso
                        int chequeo = 1;
                        if (congreso.getRevisores().get(j).getTrabajoCorreguir().size() < contador) { //Comprobamos cual es el revisor que tiene menos trabajos asignados
                            for (int k = 0; k < congreso.getRevisores().get(j).getSubTematica().size(); k++) {//subtematicas revior
                                for (int f = 0; f < congreso.getTrabajosCon().get(i).getSubTematicas().size(); f++) {//subtematicas del trabajo
                                    if (congreso.getTrabajosCon().get(i).getSubTematicas().get(f).equals(congreso.getRevisores().get(j).getSubTematica().get(k))) {
                                        chequeo = 0; //si coincide alguna subtematica trabajo-revisor chequeo =0
                                        break;
                                    }
                                }
                                if (chequeo == 0) { //salimos del bucle
                                    break;
                                }
                            }
                            if (chequeo == 0) { //Comprobamos que ese revisor no tenga asignado ya ese trabajo
                                int chequeo2 = 1;

                                if (congreso.getTrabajosCon().get(i).getFechas().containsKey(congreso.getRevisores().get(j).getDni())) {
                                    chequeo2 = 0;

                                }

                                if (chequeo2 == 1) {
                                    contador = congreso.getRevisores().get(j).getTrabajoCorreguir().size();
                                }
                            }
                        }
                    }

                    if (contador != congreso.getTrabajosCon().size() + 1) {
                        for (int j = 0; j < congreso.getRevisores().size(); j++) {
                            if (congreso.getTrabajosCon().get(i).getFechas().size() < 3) {
                                if (congreso.getRevisores().get(j).getTrabajoCorreguir().size() == contador) {
                                    int chequeo = 0;//Comprobar la tematica
                                    for (int m = 0; m < congreso.getRevisores().get(j).getSubTematica().size(); m++) {
                                        for (int f = 0; f < congreso.getTrabajosCon().get(i).getSubTematicas().size(); f++) { //Comprobamos que que la tematica del revisor coincida con el del trabajo
                                            if (congreso.getRevisores().get(j).getSubTematica().get(m).equals(congreso.getTrabajosCon().get(i).getSubTematicas().get(f))) {
                                                    if (congreso.getTrabajosCon().get(i).getFechas().containsKey(congreso.getRevisores().get(j).getDni()) == false) {
                                                    congreso.getTrabajosCon().get(i).setFechas(congreso.getRevisores().get(j).getDni(), congreso.getFechaFinalRevisor());
                                                    congreso.getRevisores().get(j).setTrabajoCorrejir(congreso.getTrabajosCon().get(i));
                                                    //cuenta2++;
                                                    chequeo = 1;
                                                    break;
                                                }
                                            }
                                        }
                                        if (chequeo == 1) {
                                            break;
                                        }
                                    }
                                }
                            }

                        }
                    }
                }

                contador = 0;
                while (congreso.getTrabajosCon().get(i).getFechas().size() < 3 && contador != congreso.getTrabajosCon().size() + 1) {  //Mientras que no tengamos 3 revisores asignados a un trabajo

                    contador = congreso.getTrabajosCon().size() + 1;  //MIramos cuantos trabajos ahi en total
                    for (int j = 0; j < congreso.getRevisores().size(); j++) {  // recorremos todos los revisores del congreso
                        int chequeo = 1;
                        if (congreso.getRevisores().get(j).getTrabajoCorreguir().size() < contador) { //Comprobamos cual es el revisor que tiene menos trabajos asignados
                            for (int m = 0; m < congreso.getRevisores().get(j).getTematica().size(); m++) { //Comprobamos que que la tematica del revisor coincida con el del trabajo
                                if (congreso.getRevisores().get(j).getTematica().get(m).equals(congreso.getTrabajosCon().get(i).getTematica())) {
                                    chequeo = 0;
                                    break;
                                }
                            }
                            if (chequeo == 0) { //Comprobamos que ese revisor no tenga asignado ya ese trabajo
                                int chequeo2 = 1;

                                if (congreso.getTrabajosCon().get(i).getFechas().containsKey(congreso.getRevisores().get(j).getDni())) {
                                    chequeo2 = 0;

                                }

                                if (chequeo2 == 1) {
                                    contador = congreso.getRevisores().get(j).getTrabajoCorreguir().size();
                                }
                            }
                        }
                    }
                    if (contador != congreso.getTrabajosCon().size() + 1) {
                        for (int j = 0; j < congreso.getRevisores().size(); j++) {
                            if (congreso.getTrabajosCon().get(i).getFechas().size() < 3) {
                                if (congreso.getRevisores().get(j).getTrabajoCorreguir().size() == contador) { //Comprobar la tematica
                                    for (int m = 0; m < congreso.getRevisores().get(j).getTematica().size(); m++) { //Comprobamos que que la tematica del revisor coincida con el del trabajo
                                        if (congreso.getRevisores().get(j).getTematica().get(m).equals(congreso.getTrabajosCon().get(i).getTematica())) {
                                            if (congreso.getTrabajosCon().get(i).getFechas().containsKey(congreso.getRevisores().get(j).getDni()) == false) {
                                                congreso.getTrabajosCon().get(i).setFechas(congreso.getRevisores().get(j).getDni(), congreso.getFechaFinalRevisor());
                                                congreso.getRevisores().get(j).setTrabajoCorrejir(congreso.getTrabajosCon().get(i));
                                                //cuenta2++;
                                                break;
                                            }
                                        }
                                    }
                                }
                            }

                        }
                    }

                }

                while (congreso.getTrabajosCon().get(i).getFechas().size() < 3) {
                    contador = congreso.getTrabajosCon().size() + 1;  //MIramos cuantos trabajos ahi en total
                    for (int j = 0; j < congreso.getRevisores().size(); j++) {  // recorremos todos los revisores del congreso
                        if (congreso.getRevisores().get(j).getTrabajoCorreguir().size() < contador) { //Comprobamos cual es el revisor que tiene menos trabajos asignados
                            //Comprobamos que ese revisor no tenga asignado ya ese trabajo
                            int chequeo2 = 1;

                            if (congreso.getTrabajosCon().get(i).getFechas().containsKey(congreso.getRevisores().get(j).getDni())) {
                                chequeo2 = 0;
                            }

                            if (chequeo2 == 1) {
                                contador = congreso.getRevisores().get(j).getTrabajoCorreguir().size();
                            }

                        }
                    }
                    for (int j = 0; j < congreso.getRevisores().size(); j++) {
                        if (congreso.getTrabajosCon().get(i).getFechas().size() < 3) {
                            if (congreso.getRevisores().get(j).getTrabajoCorreguir().size() == contador) {
                                if (congreso.getTrabajosCon().get(i).getFechas().containsKey(congreso.getRevisores().get(j).getDni()) == false) {
                                    congreso.getTrabajosCon().get(i).setFechas(congreso.getRevisores().get(j).getDni(), congreso.getFechaFinalRevisor());
                                    congreso.getRevisores().get(j).setTrabajoCorrejir(congreso.getTrabajosCon().get(i));
                                }
                            }
                        }

                    }
                }
            }
        }

    }

    public void obtenerRevisores() {
        for (int i = 0; i < congreso.getRevisores().size(); i++) {
            System.out.println("El nombre es " + congreso.getRevisores().get(i).getNombre());
        }

    }

    public void obtenerPonentes() {
        for (int i = 0; i < congreso.getPonentes().size(); i++) {
            System.out.println("El nombre es " + congreso.getPonentes().get(i).getNombre());
        }

    }

    public void setFechaPonente(GregorianCalendar fechaFinalPonente) {
        GregorianCalendar fecha = new GregorianCalendar();
        if (fechaFinalPonente.after(fecha)) {
            congreso.setFechaFinalPonente(fechaFinalPonente);
        } else {
            System.out.println("La fecha introducida es incorrecta");
        }

    }

    public void setFechaRevisor(GregorianCalendar fechaFinalRevisor) {
        GregorianCalendar fecha = new GregorianCalendar();
        if (fechaFinalRevisor.after(fecha) || fechaFinalRevisor.after(congreso.getFechaFinalPonente())) {
            congreso.setFechaFinalRevisor(fechaFinalRevisor);
            for (int i = 0; i < congreso.getTrabajosCon().size(); i++) {
                if (congreso.getTrabajosCon().get(i).getFechas().isEmpty() == false) {
                    ArrayList<String> totalClaves = new ArrayList<String>();
                    Enumeration claves = congreso.getTrabajosCon().get(i).getFechas().keys();
                    while (claves.hasMoreElements()) {
                        totalClaves.add((String) claves.nextElement());
                    }
                    for (int j = 0; j < totalClaves.size(); j++) {
                        congreso.getTrabajosCon().get(i).setFechas(totalClaves.get(j), fechaFinalRevisor);
                    }
                }
            }
        } else {
            System.out.println("La fecha introducida es incorrecta");
        }
    }

    public void setModificacionManual(String titulo, String dni, GregorianCalendar fechas) {  //Creo que habria que meter la fecha en el trabajo y el revisor
        GregorianCalendar fecha = new GregorianCalendar();
        int chequeo = 0;
        if (fechas.after(fecha) && fechas.after(congreso.getFechaFinalPonente()) && fechas.after(congreso.getFechaFinalRevisor())) {
            for (int i = 0; i < congreso.getTrabajosCon().size(); i++) {
                if (congreso.getTrabajosCon().get(i).getTitulo().equals(titulo)) {
                    congreso.getTrabajosCon().get(i).setFechas(dni, fechas);
                    chequeo = 1;
                    break;
                }
            }
            if (chequeo == 0) {
                System.out.println("El trabajo no existe");
            }
        } else {
            System.out.println("Fecha incorrecta");
        }
    }

   
}
